@toc
语句块
JS使用大括号构成语句块。
ES6 之前语句块是没有作用域的,从ES6开始支持 块作用域
,let只能在块作用域内可见1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33function hello(){
let a = 1;
var b = 2;
c = 3
}
if (1){
let d = 4;
var e = 5;
f = 6
if (true){
console.log(d) // 可见
console.log(e) // 可见
console.log(f) // 可见
console.log('----------')
g = 10
var h = 11
}
}
// console.log(a) 不可见
// console.log(b) 不可见
// console.log(c) 不可见,函数为执行
hello()
console.log(c) // 块作用域隐式声明,可见
// console.log(d) // 块作用域使用let,不可见;但是块外的d可见
console.log(e)) // 块作用域使用var,可见
console.log(f)) // 块作用域隐式声明,可见
console.log(g)) // 可见
console.log(h)) // 可见
- let 不能突破函数、{ } 块作用域
- var 不能突破函数作用域
c = 3
隐式申明,为全局作用域流程控制
条件分支
1
2
3
4
5
6
7
8
9
10
11
12if (cond1){
}
else if (cond2) {
}
else if (cond3) {
}
else {
}
1 | 条件的False等效 |
switch…case分支语句
- 当进入
case
语句后,如果没有break
语句,会产生穿透现象 - 一直穿透到
break
语句结束 如果一直没有,将把代码执行完
1
2
3
4
5
6
7
8
9
10
11
12
13switch (expression) {
case label_1:
statements_1
[break;]
case label_2:
statements_2
[break;]
...
default:
statements_def
[break;]
}穿透问题,一定要在case中恰当的使用break语句,否则就会继续顺序向下执行
1 | let x = 5 // 换成1试一试 |
for循环
1 | // C风格for循环 |
1 | for (let i=0;i<5;i++){ |
九九乘法表1
2
3
4
5
6
7
8for (let i=1;i<10;i++){
line = ''
for (let j=1;j<=i;j++){
line += j + '*' + i + '=' + j*i + ' '
// line += `${j}*${i}=${i*j?'t':'f'} `
}
console.log(line)
}
while循环 和 do…while循环
条件满足,进入循环,条件为真,继续循环
1
2while (condition)
statement先进入
do语句
循环,然后判断,为真就继续循环1
2
3do
statement
while (condition);
1 | let x = 5 |
for…in循环
对象操作语句for...in
用来遍历对象的属性1
2
3for (variable in object) {
statements
}
1 | // 数组 |
for in
循环返回的是索引或者key,需要间接访问到值- *数组8反正返回的是索引,C风格for循环操作可能方便点
- 对象用for in合适
for…of 循环
ES6的新语法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21let arr = [1, 2, 3, 4, 5]
let obj ={
a:1,
b:'hello',
c:true
}
for (let i of arr){ //返回数组元素
console.log(i)
}
//执行结果
1
2
3
4
5
for (let i of obj){ // 异常,不可以迭代
console.log(i)
}
注意
for ... of
不能迭代一个普通对象- 原因是,of后面必须是一个迭代器
(TypeError: obj[Symbol.iterator] is not a function)
- 可类比python中的
for in
,例如for x in [ ]
break 、 continue
- break 结束当前循环
- continue 中断当前循环,直接进入下一次循环
for迭代的差别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24function sum(arr){
for (let x in arr){ // 遍历index或对象属性
console.log(x, typeof(x), arr[x]);
}
for (let x of arr){ // 遍历元素
console.log(x, typeof(x));
}
for (let x=0;x<arr.length;x++){ // 自己定义索引数值遍历
console.log(x, typeof(x), arr[x]);
}
}
sum([3,6,9]);
// 执行结果
0 string 3
1 string 6
2 string 9
3 'number'
6 'number'
9 'number'
0 'number' 3
1 'number' 6
2 'number' 9
Symbols类型
- ES6提供Symbol类型,内建原生类型
symbol值是唯一的1
2
3
4let sym1 =Symbol()
let sym2 = Symbol('key1')
let sym3 = Symbol('key2')
console.log(sym2 == sym3) //false
作为对象的属性key
1 | let s = Symbol() |
构建常量
以前的用法
1
2
3
4
5
6var COLOR_RED = 'RED';
var COLOR_ORANGE = 'ORANGE';
var COLOR_YELLOW = 'YELLOW';
var COLOR_GREEN = 'GREEN';
var COLOR_BLUE = 'BLUE';
var COLOR_VIOLET = 'VIOLET';现在的用法
1
2
3
4
5
6const COLOR_RED = Symbol();
const COLOR_ORANGE = Symbol();
const COLOR_YELLOW = Symbol();
const COLOR_GREEN = Symbol();
const COLOR_BLUE = Symbol();
const COLOR_VIOLET = Symbol();